#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
const int N = 1010, M = 1e5 + 10, MOD = 1e9 + 7;
#define INF 0x3f3f3f3f;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
ll a[M], b[M], w[M], mul[M], A, B; //a,b存对应数字每位的数字,类似高精度,w存各位的进制,mul为每个数字的实际权重
int n, sz_a, sz_b;
int main()
{
    close();
    cin >> n; //max 进制
    cin >> sz_a;
    for(int i = sz_a; i >= 1; i--) cin >> a[i]; //类似于高精度反着放
    cin >> sz_b;
    for(int i = sz_b; i >= 1; i--) cin >> b[i];

    int sz_mx = max(sz_a, sz_b);
    for(int i = sz_mx; i >= 1; i--)
    {
        int t = max(a[i] + 1, b[i] + 1);
        w[i] = max(t, 2);
    }

    //计算权值,应为是反着更新的所以当i越大乘的更多,所以要正向迭代维护前缀积
    mul[1] = 1;
    for(int i = 2; i <= sz_mx; i++) mul[i] = mul[i - 1] * w[i - 1] % MOD;//mul[i-1]其实拿的是上上位的进制总和乘以这一位的大小

    //计算A,B
    for(int i=sz_a;i>=1;i--) A=(A+a[i]*mul[i])%MOD;
    for(int i=sz_b;i>=1;i--) B=(B+b[i]*mul[i])%MOD;

    cout<<(A-B+MOD)%MOD<<'\n';//前一个mod没必要,应为固定A>B

    return 0;
}